博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP笔记09:PHP之 MVC理解
阅读量:4313 次
发布时间:2019-06-06

本文共 5725 字,大约阅读时间需要 19 分钟。

1. 首先通俗地说说我对MVC的理解:

Model是负责干活的,它干的活主要是从数据库中获取需要的数据以及对获取的数据按照业务逻辑进行加工处理,至于为什么要干某件活,何时干某件活它一概不管,而这正是Controller的职责,Controller像个餐馆招待,接到食客的需求,马上传达给厨房,Model就是大厨。View负责最终把菜端上桌,摆在合适的位置上。比如说客人来了要了个糖醋鲤鱼,接待客人的是Controller,它会通知Model做一道糖醋鲤鱼,做好之后它又会招呼View把菜端上桌,View知道这是主菜,它会把它摆在桌子中央。MVC的最大优势就在于把数据处理流程控制UI显示较好地分离开来,便于程序的开发和维护。

 

2.下面看具体实现。

这个小程序一共包含6个文件,其中index.php是程序入口、post.htm是留言表单

在lib文件夹里Model、View 、Controller三个文件分别实现MVC,DataAccess是一个简单的数据库访问类

(1)DataAccess

1 
link_id=mysql_pconnect($host,$user,$pass); //连接数据库服务器22 mysql_select_db($db,$this->link_id); //选择所需数据库23 24 mysql_query("set names utf8;");25 }26 //! 执行SQL语句27 /**28 * 执行SQL语句,获取一个查询源并存储在数据成员$query中29 * @param $sql 被执行的SQL语句字符串30 * @return void31 */32 function query($sql) {33 $this->query_id=mysql_unbuffered_query($sql,$this->link_id); // Perform query here34 if ($this->query_id) return true;35 else return false;36 }37 //! 获取结果集38 /**39 * 以数组形式返回查询结果的所有记录40 * @return mixed41 */42 function fetchRows($sql) {43 $this->query($sql);44 $arr=array();45 $i=0;46 while( $row=mysql_fetch_array($this->query_id,MYSQL_ASSOC) )47 //MYSQL_ASSOC参数决定了数组键名用字段名表示48 { $arr[$i]=$row;49 $i++;50 }51 return $arr;52 53 }54 }55 ?>

(2)下面我们要介绍Model类,这个类很简单,里面的函数一看就知道,是针对各种数据的操作,它是通过DataAccess访问数据库

Model

1 
dao中17 * Model通过调用$this->dao的fetch方法执行所需的SQL语句18 */19 function __construct(&$dao) {20 $this->dao=$dao; 21 }22 function listNote() { //获取全部留言23 $notes=$this->dao->fetchRows("SELECT * FROM note ORDER BY timedate DESC");24 25 return $notes;26 27 }28 29 function postNote() { //插入一条新留言30 31 $name=$_POST['username'];32 $email=$_POST['email'];33 $content=$_POST['content'];34 $timedate=time()+8*3600;35 $sql="INSERT INTO note (name, email, content, timedate) VALUES 36 ('".$name."', '".$email."', '".$content."', '".$timedate."' )";37 //echo $sql; //对于较复杂的合成SQL语句,
38 //调试时用echo输出一下看看是否正确是一种常用的调试技巧39 if ($this->dao->query($sql)) return true;40 else return false;41 }42 43 function deleteNote() { //删除一条留言,$id是该条留言的id44 $sql="DELETE FROM note WHERE id=".$_GET['id'];45 if ($this->dao->query($sql)) return true;46 else return false;47 }48 49 50 }51 ?>

 

(3)看完这两个类之后你可能会发现这与以前我们写程序差不多,的确现在还闻不到MVC的味道,如果你不懂MVC,在这两个类的基础上你完全可以开始写你以前的程序了。例如要显示全部留言,只需要写入下代码:

1 
listNote();8 ……9 ?>

  很亲切吧,呵呵。

    有了这个"感情基础"你就不会对MVC望而生畏了,下面我们就要上今天的主菜了,那就是"Controller"闪亮登场!
    先大体浏览一下主要结构,它包括一个Controller类以及派生出的三个子类listController对应显示留言功能postController对应发表留言功能以及deleteController对应删除留言功能)。

Controller

1 
model;13 */14 function __construct (& $dao) {15 $this->model=& new Model($dao);16 }17 18 function getView() { //获取View函数19 //返回视图对象view20 //对应特定功能的Controller子类生成对应的View子类的对象21 //通过该函数返回给外部调用者22 return $this->view;23 }24 25 }26 //用于控制显示留言列表的子类27 class listController extends Controller{ //extends表示继承 28 function __construct (& $dao) {29 parent::__construct($dao); //继承其父类的构造函数30 //该行的含义可以简单理解为:31 //将其父类的构造函数代码复制过来32 $notes=$this->model->listNote();33 $this->view=& new listView($notes);34 //创建相应的View子类的对象来完成显示35 36 37 38 }39 }40 //用于控制添加留言的子类41 class postController extends Controller{42 function __construct (& $dao) {43 parent::__construct($dao);44 if ($this->model->postNote()) $success=1;45 else $success=0;46 $this->view=& new postView($success);47 }48 }49 //用于控制删除留言的子类50 class deleteController extends Controller{51 function __construct (& $dao) {52 parent::__construct($dao);53 if ($this->model->deleteNote()) $success=1;54 else $success=0;55 $this->view=& new deleteView($success);56 }57 }58 59 ?>

 

(4)大体浏览之后,你一定打算开始仔细研究它了吧,别急,为了心中有数,我们先从宏观着眼,先看看总入口index.php是如何调用Controller的

1  2  3 
4 PHP MVC留言板 5 6 7 添加新留言
8

9

getView(); //获取视图对象38 $view->display(); //输出HTML39 ?>40 41

看过index.php之后你就更清楚了吧,原来功能是通过$_GET[“action”]指定的,由一个switch结构分发,不同的功能对应不同的Controller子类。现在可以滚上去(滚动页面上去的简称,绝非不洁用语^_^)仔细看看这个Controller代码了。注释应该很细了,不懂的地方就去看看PHP5的OOP语法和概念吧,单纯看这些概念总是越看催眠效果越好,现在带着实际问题去看,应该有所不同吧。不过我还是建议你在完成这个MVC的Hello World知道MVC是怎么回事之后下功夫打好OOP的基础,毕竟那是根本啊。

 

(5)怎么样,Controller真是个光说不练的家伙吧,看不到三行它就把你引向View了,那就看看View吧

View里有对应的子类,负责相应功能的显示。理解了Controller,View的代码就不难看了,难看的话也是因为混杂着HTML的原因,它所做的就是把Controller(Controller是个二道贩子,它的数据来自Model)给它的数据,然后塞到HTML中

View

1 
output);13 14 }15 }16 class listView extends View //显示所有留言的子类17 {18 function __construct($notes)19 {20 foreach ($notes as $value)21 {22 $this->output.="

访客姓名:".$value['name']."

".23 "

访客邮箱:".$value['email']."

".24 "

访客留言:".$value['content']."

".25 "

来访时间:".date("y-m-d H:i",$value['timedate'])."

".26 "

删除留言".27 "


"; 28 }29 30 31 }32 }33 class postView extends View //发表留言的子类34 {35 function __construct($success)36 {37 if ($success)38 $this->output="留言成功!
查看";39 else40 $this->output="留言保存失败!";41 }42 }43 class deleteView extends View //删除留言的子类44 {45 function __construct($success)46 {47 if ($success)48 $this->output="留言删除成功!
查看";49 50 }51 }52 ?>

之所以UI方面写得如此简陋,是因为这些工作可以交给Smarty这样的模板去做,而我们这里就像集中精力研究MVC,不想把Smarty扯进来,所以就这样凑合了,以后我们可以再把Smarty结合进来。

看了这个东西之后不知你是否对MVC的概念和实现更明白了一点。

转载于:https://www.cnblogs.com/hebao0514/p/5670607.html

你可能感兴趣的文章
线段树模板整理
查看>>
[教程][6月4日更新]VMware 8.02虚拟机安装MAC lion 10.7.3教程 附送原版提取镜像InstallESD.iso!...
查看>>
[iOS问题归总]iPhone上传项目遇到的问题
查看>>
Python天天美味(总) --转
查看>>
Spring Framework tutorial
查看>>
【VS开发】win7下让程序默认以管理员身份运行
查看>>
【机器学习】Learning to Rank 简介
查看>>
Unity 使用实体类
查看>>
【转】通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件...
查看>>
MySQL常见注意事项及优化
查看>>
流畅的Python (Fluent Python) —— 前言
查看>>
Jquery-menu-aim流畅的菜单滑动体验
查看>>
Jquery EasyUI修改行背景的两种方式
查看>>
生成器模式(Builder)C++实现
查看>>
Centos 7.5安装 Redis 5.0.0
查看>>
嵌入式Linux学习笔记(0)基础命令。——Arvin
查看>>
二分图匹配
查看>>
c++ 模板template
查看>>
javascript中的string对象
查看>>
CString的成员函数详解
查看>>